channel
的可讓不同的goroutines
相互溝通,
可將channel
想像成一個管子,管子連接不同的goroutines
並相互傳遞資料,
如下圖示意,兩隻土撥鼠在管子中互丟球XDD
圖片來源:https://ucarecdn.com/27841b05-0ecb-4a22-a0c3-1047e9ef0a2f/
channel
會發生什麼事??實作goroutines
相互傳資料做累加。
package main
import (
"fmt"
"time"
)
func add(pt *int, num int, t int) {
time.Sleep(100 * time.Millisecond)
*pt = *pt + num
fmt.Println(t, "-num的值", *pt)
}
func main() {
var num int = 10
var pt *int //宣告一個指標
pt = &num //取得num的記憶體位置
go add(pt, 10, 1)
go add(pt, 10, 2)
add(pt, 10, 3)
}
每次輸出結果都不同
1 -num的值 20
3 -num的值 30
channel
,資料型別為goroutines
接收與傳送的資料型別,c := make(chan 資料型別)
傳送: channel <-
接收: <- channel
關閉channel:close(channel)
以參考資料範例為例:
package main
import "fmt"
// Prints a greeting message using values received in
// the channel
func greet(c chan string) {
name := <-c // 接收channel資料
fmt.Println("Hello", name)
}
func main() {
c := make(chan string) //宣告一個channel,資料類型string
go greet(c)
c <- "World" //發送channel資料
close(c) // 關閉channel
}
輸出結果:
Hello World
使用channel
傳遞、接收資料做累加。
package main
import (
"fmt"
"time"
)
func add(c chan int, num int, t int) {
time.Sleep(100 * time.Millisecond)
a := <-c // 接收channel資料
a = a + num
fmt.Println(t, "-num的值", a)
c <- a //發送channel資料
}
func main() {
c := make(chan int) //宣告一個channel,資料類型int
var num int = 10
go add(c, 10, 1)
c <- num //發送channel資料
num = <-c // 接收channel資料
fmt.Println(num)
go add(c, 10, 2)
c <- num //發送channel資料
num = <-c // 接收channel資料
fmt.Println(num)
go add(c, 10, 3)
c <- num //發送channel資料
num = <-c // 接收channel資料
fmt.Println(num)
close(c) // 關閉channel
}
輸出結果:
1 -num的值 20
num = 20
2 -num的值 30
num = 30
3 -num的值 40
num = 40
以上是實驗的範例,不曉得在撰寫上有沒有什麼錯誤,
如有錯誤歡迎指教~